package com.ruoyi.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;
import cn.hutool.json.JSONUtil;
import com.ruoyi.po.Account;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

/**
 * 描述：快速生成账号加密的工具类
 * @author 杨宸
 * @date 2025-02-12
 */
@Component
@Slf4j
public class AccountEncUtil {

    /**
     * SM4过密加密算法
     */
    private static final SM4 SM4 = SmUtil.sm4();

    /**
     * 默认密码
     */
    private static final String DEFAULT_PASSWORD = "123456";

    /**
     * 描述：加密密码
     * @author 杨宸
     * @date 2025-02-12
     */
    public static Account encodePassword(Account account) {
        // 账号为空处理
        if (account == null) {
            return null;
        }
        // 密码为空处理
        String password = account.getPassword();
        if (StringUtils.isBlank(password)) {
            password = DEFAULT_PASSWORD;
        }
        account.setPassword(SM4.encryptBase64(password));
        return account;
    }

    public static String token(Account account) {
        StringBuilder tokenBuilder = new StringBuilder();
        Long id = account.getId();
        String idEnc = SM4.encryptBase64(String.valueOf(id));
        tokenBuilder.append(idEnc).append(".");
        String timeEnc = SM4.encryptBase64(DateUtil.now());
        tokenBuilder.append(timeEnc).append(".");
        String randomEnc = SM4.encryptBase64(RandomUtil.randomString(8));
        tokenBuilder.append(randomEnc);
        return tokenBuilder.toString();
    }

//    public Boolean validatePassword(ExternalAccount account) {
//        String username = account.getUsername();
//        String phone = account.getPhone();
//        // 用户名和手机号都没有填写
//        if (StringUtils.isBlank(username) && StringUtils.isBlank(phone)) {
//            return false;
//        }
//        // 密码未填写
//        String password = account.getPassword();
//        if (StringUtils.isBlank(password)) {
//            return false;
//        }
//        try {
//            ExternalAccount dbAccount = externalAccountService.lambdaQuery()
//                    .eq(ExternalAccount::getUsername, username)
//                    .or()
//                    .eq(ExternalAccount::getPhone, phone)
//                    .one();
//            // 未找到账号
//            if (dbAccount == null) {
//                return false;
//            }
//            // 校验返回
//            String dbPassword = dbAccount.getPassword();
//            return Objects.equals(SM4.encryptBase64(password), dbPassword);
//        } catch (Exception e) {
//            log.error("[ExternalAccountEncUtil.validatePassword]校验密码失败, 存在多个账号", e);
//            return false;
//        }
//    }

}
